package com.rpp.handler;

import com.rpp.request.RpcRequest;
import com.rpp.utils.ApplicationUtils;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.lang.reflect.Method;

/**
 * 自定义的业务处理器
 */
public class UserServiceHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当客户端读取数据时,该方法会被调用
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        System.out.println("服务端接收到客户端发送的数据：" + msg.toString());

        //客户端发送请求 传递的是通信协议对象 RpcRequest
        //1.判断当前的请求是否符合规则
        if (msg instanceof RpcRequest) {
            //通信协议对象
            RpcRequest rpcRequest = (RpcRequest) msg;
            //请求对应的类、方法、参数信息
            String className = rpcRequest.getClassName();
            String methodName = rpcRequest.getMethodName();
//            Class<?>[] parameterTypes = rpcRequest.getParameterTypes();
            Object[] parameters = rpcRequest.getParameters();

            //通过容器获取对象、方法、参数，利用反射执行对象的方法
            //通过类名称获取实例
            Object bean = ApplicationUtils.getBean(className);

            //获取对象实例的所有方法
            Method[] declaredMethods = bean.getClass().getDeclaredMethods();
            for (Method declaredMethod : declaredMethods) {
                if (!declaredMethod.getName().equals(methodName)) {
                    continue;
                }
                declaredMethod.setAccessible(true);

                Object result = declaredMethod.invoke(bean, parameters);
                System.out.println(result);
                //把调用实现类的方法获得的结果写到客户端
                ctx.writeAndFlush(result);
            }
        }
    }
}
